package main

import "fmt"

func main() {
	// 数组
	// 存放元素的容器
	// 必须指定存放的元素类型和容量(长度)

	var a1 [3]bool // [true false true]
	var a2 [4]bool // [true true false true]
	// 数组长度是数组类型的一部分
	fmt.Printf("a1:%T a2:%T", a1, a2)
	// 声明数组
	// var 数组名 [长度]T
	// var a [3]int
	// var b [4]int
	// a = b // 不可以比较  此时a和b是不同类型

	// 数组的初始化
	// 如果不初始化: 默认元素都是零值(布尔值:false, 整形和浮点型都是0,字符串: "")

	// 1. 初始化方式1
	a1 = [3]bool{true, true, true}
	fmt.Println(a1)
	// 2.初始化方式2
	// a10 := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
	// 根据初始值自动推断数组的长度是多少
	a10 := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
	fmt.Println(a10)
	// 3.初始化方式3: 根据索引初始化
	// a3 := [5]int{1, 2} // 未初始化补零了
	// fmt.Println(a3)
	a3 := [5]int{0: 1, 4: 2}
	fmt.Println(a3)

	// 数组的遍历
	// citys := [...]string{"北京", "上海", "深圳"} // 索引: 0~2 citys[0] citys[1] citys[2]
	// 1.根据索引遍历
	// for i := 0; i < len(citys); i++ {
	// 	fmt.Println(citys[i])
	// }
	// 2. for range 遍历
	// for i, v := range citys {
	// 	fmt.Println(i, v)
	// }

	// 多维数组
	// [ [1 2] [3, 4] [5, 6]]
	// var a11 [3][2]int
	var a11 [3][2]int = [3][2]int{
		[2]int{1, 2},
		[2]int{3, 4},
		[2]int{5, 6},
	}
	fmt.Println(a11)

	// 多维数组的遍历
	for _, v1 := range a11 {
		fmt.Println(v1)
		for _, v2 := range v1 {
			fmt.Println(v2)

		}
	}

	// 数组是值类型
	b1 := [3]int{1, 2, 3} // [1, 2, 3]
	b2 := b1              // [1, 2, 3] Ctrl + C Ctrl + V => 把	world文档从文件夹A拷贝到文件夹B
	b2[0] = 100           // [100, 2, 3]
	fmt.Println(b1, b2)   // b1 [1, 2, 3]  b2 [100, 2, 3]

	// 注意事项:
	// 1. 数组支持 "==" "!=" 操作符, 因为内存总是被初始化过的.
	// 2. [n]*T 表示指针数组, *[n]T 表示数组指针
}
